﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using Badge_Manager.Model;

namespace Badge_Manager.Controller
{
    public class ctrlCorso
    {
        Connector Connessione = Connector.Istance();

        public void Inserisci(Corso corso)
        {
            string query = "INSERT INTO Corsi(id,codice,datainizio,nome,numeroore) VALUES (@id, @codice, @datainizio, @nome, @numeroore)";
            try
            {
                SqlCommand insert = new SqlCommand(query, Connessione.Connessione);

                SqlParameter id = new SqlParameter();
                id.ParameterName = "@id";
                id.SqlDbType = SqlDbType.UniqueIdentifier;
                id.Value = corso.Id;
                insert.Parameters.Add(id);

                SqlParameter codice = new SqlParameter();
                codice.ParameterName = "@codice";
                codice.SqlDbType = SqlDbType.NVarChar;
                codice.Value = corso.Codice;
                insert.Parameters.Add(codice);

                SqlParameter datainizio = new SqlParameter();
                datainizio.ParameterName = "@datainizio";
                datainizio.SqlDbType = SqlDbType.DateTime;
                datainizio.Value = corso.DataInizio;
                insert.Parameters.Add(datainizio);

                SqlParameter nome = new SqlParameter();
                nome.ParameterName = "@nome";
                nome.SqlDbType = SqlDbType.NVarChar;
                nome.Value = corso.Nome;
                insert.Parameters.Add(nome);

                SqlParameter numeroore = new SqlParameter();
                numeroore.ParameterName = "@numeroore";
                numeroore.SqlDbType = SqlDbType.Int;
                numeroore.Value = corso.NumeroOre;
                insert.Parameters.Add(numeroore);

                //SqlParameter datafine = new SqlParameter();
                //datafine.ParameterName = "@datafine";
                //datafine.SqlDbType = SqlDbType.DateTime;
                //datafine.Value = corso.Datafine;
                //insert.Parameters.Add(datafine);

                insert.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                MessageBox.Show("Errore nel Controllo dell'Inserimento" + ex.Message);
            }
        }

        public int UpdateDataFine(Attivita attivita)
        {
            string sql = @"update Corsi SET
                datafine=@datafine
                where id=@id";
            try
            {
                SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);

                SqlParameter id = new SqlParameter();
                id.ParameterName = "@id";
                id.SqlDbType = SqlDbType.UniqueIdentifier;
                id.Value = attivita.Corso.Id;
                cmd.Parameters.Add(id);

                /*calcolo la data di fine del corso in base alle ore scartando i festivi*/
                DateTime datafineCalcolata;
                DataTable dt = new DataTable();
                dt = new ctrlAttivitaDettaglio(null).Ricerca(" DettaglioAttivita.idattivita='" + attivita.Id
                    + "' ORDER BY DettaglioAttivita.Giorno DESC");
                datafineCalcolata = (DateTime)dt.Rows[0]["Giorno"];
                /*fine*/

                SqlParameter datafine = new SqlParameter();
                datafine.ParameterName = "@datafine";
                datafine.SqlDbType = SqlDbType.Date;
                datafine.Value = datafineCalcolata.Date;
                cmd.Parameters.Add(datafine);

                return cmd.ExecuteNonQuery();
            }
            catch { return -1; }
        }

        public void Update(Corso corso)
        {
            string query = "UPDATE Corsi SET codice = @codice, datainizio = @datainizio, nome = @nome, numeroore =  @numeroore "
                            + " WHERE id ='" + corso.Id + "'";
            try
            {
                SqlCommand update = new SqlCommand(query, Connessione.Connessione);

                SqlParameter codice = new SqlParameter();
                codice.ParameterName = "@codice";
                codice.SqlDbType = SqlDbType.NVarChar;
                codice.Value = corso.Codice;
                update.Parameters.Add(codice);

                SqlParameter datainizio = new SqlParameter();
                datainizio.ParameterName = "@datainizio";
                datainizio.SqlDbType = SqlDbType.DateTime;
                datainizio.Value = corso.DataInizio;
                update.Parameters.Add(datainizio);

                SqlParameter nome = new SqlParameter();
                nome.ParameterName = "@nome";
                nome.SqlDbType = SqlDbType.NVarChar;
                nome.Value = corso.Nome;
                update.Parameters.Add(nome);

                SqlParameter numeroore = new SqlParameter();
                numeroore.ParameterName = "@numeroore";
                numeroore.SqlDbType = SqlDbType.Int;
                numeroore.Value = corso.NumeroOre;
                update.Parameters.Add(numeroore);

                /*SqlParameter datafine = new SqlParameter();
                datafine.ParameterName = "@datafine";
                datafine.SqlDbType = SqlDbType.DateTime;
                datafine.Value = corso.DataFine;
                update.Parameters.Add(datafine);*/

                update.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                MessageBox.Show("Errore nel Controllo dell'Update" + ex.Message);
            }
        }

        public Corso GetCorsoById(Guid id)
        {
            Corso corsoDaRitornare = new Corso();
            string query = " SELECT * FROM Corsi WHERE id = '" + id + "'";

            DataTable dataTable = new DataTable();

            SqlDataAdapter dp = new SqlDataAdapter(query, Connessione.Connessione);
            dp.Fill(dataTable);

            corsoDaRitornare.Id = (Guid)dataTable.Rows[0]["id"];
            corsoDaRitornare.Nome = dataTable.Rows[0]["nome"].ToString();
            corsoDaRitornare.Codice = dataTable.Rows[0]["codice"].ToString();
            corsoDaRitornare.NumeroOre = (Int32)dataTable.Rows[0]["numeroore"];
            corsoDaRitornare.DataInizio = (DateTime)dataTable.Rows[0]["datainizio"];
            if (dataTable.Rows[0]["datafine"] != DBNull.Value)
                corsoDaRitornare.DataFine = (DateTime)dataTable.Rows[0]["datafine"];

            return corsoDaRitornare;
        }

        public List<Corso> SelectAll()
        {
            List<Corso> corsiDaRitornare = new List<Corso>();
            string query = " SELECT * FROM Corsi ";
            DataTable dataTable = new DataTable();
            SqlDataAdapter dp = new SqlDataAdapter(query, Connessione.Connessione);
            dp.Fill(dataTable);

            foreach (DataRow row in dataTable.Rows)
            {
                Corso corsoDaRitornare = new Corso();
                corsoDaRitornare.Id = (Guid)row["id"];
                corsoDaRitornare.Nome = row["nome"].ToString();
                corsoDaRitornare.Codice = row["codice"].ToString();
                corsoDaRitornare.NumeroOre = (Int32)row["numeroore"];
                corsoDaRitornare.DataInizio = (DateTime)row["datainizio"];
                if (!string.IsNullOrWhiteSpace(row[5].ToString()))
                    corsoDaRitornare.DataFine = (DateTime?)row["datafine"];
                else
                    corsoDaRitornare.DataFine = null;
                corsiDaRitornare.Add(corsoDaRitornare);
            }
            return corsiDaRitornare;
        }

        public void Delete(Corso daCancellare)
        {
            string query = " DELETE FROM Corsi WHERE id = '" + daCancellare.Id + "'";
            SqlCommand elimina = new SqlCommand(query, Connessione.Connessione);
            try
            {
                elimina.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 547)
                    throw new CorsoAssociatoAdAttivita();
            }
        }

        public void DeleteBy(Guid id)
        {
            string query = " DELETE FROM Corsi WHERE id = '" + id + "'";
            SqlCommand elimina = new SqlCommand(query, Connessione.Connessione);
            try
            {
                elimina.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 547)
                    throw new CorsoAssociatoAdAttivita();
            }
        }
    }
}